#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <functional>
#include <vector>
using namespace std;

// Core 
int main()
{
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    int a = 0, b = 10, c = 0;
    a = b / c;
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    cout << "hello world" << endl;
    cout << "hello world" << endl;

    return 0;
}

// // 九号信号不能被阻塞
// void Print(sigset_t &pending)
// {
//     cout << "pending : ";
//     for (int i = 31; i >= 1; i--)
//     {
//         if (sigismember(&pending, i))
//             cout << '1';
//         else
//             cout << '0';
//     }
//     cout << endl;
// }

// int main()
// {
//     sigset_t block, oblock; // 记录新、旧block表
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     // 遍历所有信号值 代码写得是都设置为阻塞
//     for(int i = 1; i <= 31; i++) sigaddset(&block, i);

//     // 设置进进程的block表
//     sigprocmask(SIG_SETMASK, &block, &oblock);

//     // 打印pending表 先获取
//     int cnt = 0;
//     while (true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         Print(pending);
//         sleep(1);
//     }
// }
// // 测试阻塞并且发送信号之后的pending表变化
// void Print(sigset_t &pending)
// {
//     cout << "pending : ";
//     for (int i = 31; i >= 1; i--)
//     {
//         if (sigismember(&pending, i))
//             cout << '1';
//         else
//             cout << '0';
//     }
//     cout << endl;
// }
// void sighandler(int signum)
// {
//     cout << "***********************************" << endl;
//     cout << "捕捉到信号 : " << signum << endl;
//     sigset_t pending;
//     sigpending(&pending);
//     Print(pending);
//     cout << "***********************************" << endl;
// }
// int main()
// {
//     signal(SIGINT, sighandler);
//     sigset_t block, oblock; // 记录新、旧block表
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     // 将二号信号置为1
//     sigaddset(&block, SIGINT);

//     // 设置进进程的block表
//     sigprocmask(SIG_SETMASK, &block, &oblock);
//     // 此时2号信号阻塞开始发送信号观察pending表变化

//     // 打印pending表 先获取
//     int cnt = 0;
//     while (true)
//     {
//         sigset_t pending;
//         sigpending(&pending);
//         Print(pending);
//         sleep(1);

//         cnt++;
//         if (cnt == 10) // 恢复
//         {
//             cout << "恢复二号信号阻塞为正常状态" << endl;
//             sigprocmask(SIG_SETMASK, &oblock, nullptr);
//         }
//     }
// }

// // SIG_DEL && SIG_IGN

// void sighandler(int signum)
// {
//     cout << "收到一个信号 : " << signum << endl;
//     //signal(signum, SIG_DFL); // 自定义处理之后将收到signum之后的处理方式改为默认处理方式
//     signal(signum, SIG_IGN); // 自定义处理之后将收到signum之后的处理方式改为忽略处理方式
// }
// int main()
// {
//     signal(SIGINT, sighandler);
//     int cnt = 0;
//     while (true)
//     {
//         cout << "cnt : " << cnt++ << endl;
//         sleep(1);
//     }
//     return 0;
// }

// // // 软件条件发送信号——闹钟

// // 包装器 让函数有类型
// using func_t = function<void()>;
// // 收集任务
// vector<func_t> func;
// // 任务
// void f1()
// {
//     cout << "f1()" << endl;
// }
// void f2()
// {
//     cout << "f2()" << endl;
// }
// void f3()
// {
//     cout << "f3()" << endl;
// }

// void sighandler(int signum)
// {
//     cout << "*******************************" << endl;
//     for(auto& f : func) f();
//     cout << "*******************************" << endl;
//     alarm(1);
// }
// int main()
// {
//     // 注册任务
//     func.push_back(f1);
//     func.push_back(f2);
//     func.push_back(f3);
//     // 自定义捕捉
//     signal(SIGALRM, sighandler);
//     alarm(1); // 1s之后发送SIGALRM信号给这个进程
//     int cnt = 0;
//     while (true)
//     {
//         pause();
//     }
// }

// int cnt = 0;
// void sighandler(int signum)
// {
//     cout << "收到一个信号 : " << signum << ", pid : " << getpid() << endl;
//     cout << "cnt : " << cnt << endl;
//     exit(1);
// }
// int main()
// {
//     // 自定义捕捉
//     signal(SIGALRM, sighandler);
//     alarm(1); // 1s之后发送SIGALRM信号给这个进程
//     while (true)
//     {
//         // cout << "cnt : " << cnt++ << ", pid : " << getpid() << endl;
//         cnt++;
//     }
// }

// void sighandler(int signum)
// {
//     cout << "收到一个信号 : " << signum << endl;
//     exit(13);
// }
// // 硬件发送信号
// int main()
// {
//     for (int i = 1; i <= 31; i++)
//     {
//         signal(i, sighandler);
//     }
//     int cnt = 0;
//     while (true)
//     {
//         sleep(1);
//         cout << "hello world , " << cnt++ << ", pid : " << getpid() << endl;
//         // int a = 0, b = 10;
//         // int c = b / a;
//         int* ptr = nullptr;
//         *ptr = 10;
//     }
//     return 0;
// }
// int main()
// {
//     // signal(SIGINT, sighandler);
//     for (int i = 1; i <= 31; i++)
//     {
//         signal(i, sighandler);
//     }
//     // for(int i = 0; i <= 31; i++)
//     // {
//     //     sleep(1);
//     //     if(i == 9 || i == 19) continue;
//     //     raise(i);
//     // }
//     int cnt = 0;
//     while (true)
//     {
//         sleep(1);
//         cout << "hello world , " << cnt++ << ", pid : " << getpid() << endl;
//         abort();
//     }
//     return 0;
// }